package ve.usb.ddp.hibernate;

import ve.usb.cohesion.runtime.LocalDate;

import ve.usb.cohesion.runtime.LocalDate;

import ve.usb.cohesion.runtime.LocalDate;

import java.util.HashSet;
import java.util.Set;

import java.util.Calendar;
import java.util.Date;

public class Profesor implements java.io.Serializable, ve.usb.cohesion.runtime.Auditable {

    /** Creates a new instance of Profesor */
    public Profesor() {}
    
    /**
     * Holds value of property id.
     */
    private Long id;

    /**
     * Getter for property id.
     * @return Value of property id.
     */
    public Long getId() {
        return this.id;
    }

    /**
     * Holds value of property idProfesor.
     */
    private long idProfesor;

    /**
     * Getter for property idProfesor.
     * @return Value of property idProfesor.
     */
    public long getIdProfesor() {
        return this.idProfesor;
    }

    /**
     * Setter for property idProfesor.
     * @param idProfesor New value of property idProfesor.
     */
    public void setIdProfesor(long idProfesor) {
        this.id = this.idProfesor = idProfesor;
    }
    /**
     * Holds value of property ci.
     */
    private int ci;

    /**
     * Getter for property ci.
     * @return Value of property ci.
     */
    public int getCi() {
        return this.ci;
    }

    /**
     * Setter for property ci.
     * @param ci New value of property ci.
     */
    public void setCi(int ci) {
        this.ci = ci;
    }
    /**
     * Holds value of property primerNombre.
     */
    private String primerNombre = "";

    /**
     * Getter for property primerNombre.
     * @return Value of property primerNombre.
     */
    public String getPrimerNombre() {
        return this.primerNombre;
    }

    /**
     * Setter for property primerNombre.
     * @param primerNombre New value of property primerNombre.
     */
    public void setPrimerNombre(String primerNombre) {
        this.primerNombre = primerNombre;
    }
    /**
     * Holds value of property fec_Nac.
     */
    private java.util.Date fec_Nac;

    /**
     * Getter for property fec_Nac.
     * @return Value of property fec_Nac.
     */
    public java.util.Date getFec_Nac() {
        return this.fec_Nac;
    }

    /**
     * Setter for property fec_Nac.
     * @param fec_Nac New value of property fec_Nac.
     */
    public void setFec_Nac(java.util.Date fec_Nac) {
        if (fec_Nac==null || fec_Nac instanceof LocalDate) 
            this.fec_Nac = fec_Nac;
        else this.fec_Nac = new LocalDate(fec_Nac);
    }
    /**
     * Holds value of property fec_Ing_USB.
     */
    private java.util.Date fec_Ing_USB;

    /**
     * Getter for property fec_Ing_USB.
     * @return Value of property fec_Ing_USB.
     */
    public java.util.Date getFec_Ing_USB() {
        return this.fec_Ing_USB;
    }

    /**
     * Setter for property fec_Ing_USB.
     * @param fec_Ing_USB New value of property fec_Ing_USB.
     */
    public void setFec_Ing_USB(java.util.Date fec_Ing_USB) {
        if (fec_Ing_USB==null || fec_Ing_USB instanceof LocalDate) 
            this.fec_Ing_USB = fec_Ing_USB;
        else this.fec_Ing_USB = new LocalDate(fec_Ing_USB);
    }
    /**
     * Holds value of property novel.
     */
    private boolean novel;

    /**
     * Getter for property novel.
     * @return Value of property novel.
     */
    public boolean getNovel() {
        return this.novel;
    }

    /**
     * Setter for property novel.
     * @param novel New value of property novel.
     */
    public void setNovel(boolean novel) {
        this.novel = novel;
    }
    /**
     * Holds value of property set_Pai.
     */
    private Set<Pai> set_Pai = new HashSet<Pai>();

    /**
     * Getter for property set_Pai.
     * @return Value of property set_Pai.
     */
    public Set<Pai> getSet_Pai() {
        return this.set_Pai;
    }

    /**
     * Setter for property set_Pai.
     * @param set_Pai New value of property set_Pai.
     */
    public void setSet_Pai(Set<Pai> set_Pai) {
        this.set_Pai = set_Pai;
    }

    /**
     * Add an element to set property set_Pai
     * and sets elements's property profesor.
     * @param element New element to be added to set_Pai.
     */
    public void addToSet_Pai(Pai element) {
        element.setProfesor(this);
        set_Pai.add(element);
    }

    /**
     * Removes and old element from set set_Pai 
     * and sets element's property profesor to null.
     * @param old The element to be removed from set_Pai
     */
    public void removeFromSet_Pai(Pai old) {
        set_Pai.remove(old);
        old.setProfesor(null);
    }
    /**
     * Holds value of property primerApellido.
     */
    private String primerApellido = "";

    /**
     * Getter for property primerApellido.
     * @return Value of property primerApellido.
     */
    public String getPrimerApellido() {
        return this.primerApellido;
    }

    /**
     * Setter for property primerApellido.
     * @param primerApellido New value of property primerApellido.
     */
    public void setPrimerApellido(String primerApellido) {
        this.primerApellido = primerApellido;
    }
    /**
     * Holds value of property segundoNombre.
     */
    private String segundoNombre = "";

    /**
     * Getter for property segundoNombre.
     * @return Value of property segundoNombre.
     */
    public String getSegundoNombre() {
        return this.segundoNombre;
    }

    /**
     * Setter for property segundoNombre.
     * @param segundoNombre New value of property segundoNombre.
     */
    public void setSegundoNombre(String segundoNombre) {
        this.segundoNombre = segundoNombre;
    }
    /**
     * Holds value of property segundoApellido.
     */
    private String segundoApellido = "";

    /**
     * Getter for property segundoApellido.
     * @return Value of property segundoApellido.
     */
    public String getSegundoApellido() {
        return this.segundoApellido;
    }

    /**
     * Setter for property segundoApellido.
     * @param segundoApellido New value of property segundoApellido.
     */
    public void setSegundoApellido(String segundoApellido) {
        this.segundoApellido = segundoApellido;
    }
    /**
     * Holds value of property division.
     */
    private String division = "";

    /**
     * Getter for property division.
     * @return Value of property division.
     */
    public String getDivision() {
        return this.division;
    }

    /**
     * Setter for property division.
     * @param division New value of property division.
     */
    public void setDivision(String division) {
        this.division = division;
    }
    /**
     * Holds value of property departamento.
     */
    private String departamento = "";

    /**
     * Getter for property departamento.
     * @return Value of property departamento.
     */
    public String getDepartamento() {
        return this.departamento;
    }

    /**
     * Setter for property departamento.
     * @param departamento New value of property departamento.
     */
    public void setDepartamento(String departamento) {
        this.departamento = departamento;
    }
    /**
     * Holds value of property categoria.
     */
    private String categoria = "";

    /**
     * Getter for property categoria.
     * @return Value of property categoria.
     */
    public String getCategoria() {
        return this.categoria;
    }

    /**
     * Setter for property categoria.
     * @param categoria New value of property categoria.
     */
    public void setCategoria(String categoria) {
        this.categoria = categoria;
    }
    /**
     * Holds value of property correo.
     */
    private String correo = "";

    /**
     * Getter for property correo.
     * @return Value of property correo.
     */
    public String getCorreo() {
        return this.correo;
    }

    /**
     * Setter for property correo.
     * @param correo New value of property correo.
     */
    public void setCorreo(String correo) {
        this.correo = correo;
    }
    /**
     * Holds value of property pas.
     */
    private Set<Pas> pas = new HashSet<Pas>();

    /**
     * Getter for property pas.
     * @return Value of property pas.
     */
    public Set<Pas> getPas() {
        return this.pas;
    }

    /**
     * Setter for property pas.
     * @param pas New value of property pas.
     */
    public void setPas(Set<Pas> pas) {
        this.pas = pas;
    }

    /**
     * Add an element to set property pas
     * and sets elements's property profesor.
     * @param element New element to be added to pas.
     */
    public void addToPas(Pas element) {
        element.setProfesor(this);
        pas.add(element);
    }

    /**
     * Removes and old element from set pas 
     * and sets element's property profesor to null.
     * @param old The element to be removed from pas
     */
    public void removeFromPas(Pas old) {
        pas.remove(old);
        old.setProfesor(null);
    }
    /**
     * Holds value of property paa.
     */
    private Set<Paa> paa = new HashSet<Paa>();

    /**
     * Getter for property paa.
     * @return Value of property paa.
     */
    public Set<Paa> getPaa() {
        return this.paa;
    }

    /**
     * Setter for property paa.
     * @param paa New value of property paa.
     */
    public void setPaa(Set<Paa> paa) {
        this.paa = paa;
    }

    /**
     * Add an element to set property paa
     * and sets elements's property profesor.
     * @param element New element to be added to paa.
     */
    public void addToPaa(Paa element) {
        element.setProfesor(this);
        paa.add(element);
    }

    /**
     * Removes and old element from set paa 
     * and sets element's property profesor to null.
     * @param old The element to be removed from paa
     */
    public void removeFromPaa(Paa old) {
        paa.remove(old);
        old.setProfesor(null);
    }
    /**
     * Holds value of property fec_Renuncia.
     */
    private java.util.Date fec_Renuncia;

    /**
     * Getter for property fec_Renuncia.
     * @return Value of property fec_Renuncia.
     */
    public java.util.Date getFec_Renuncia() {
        return this.fec_Renuncia;
    }

    /**
     * Setter for property fec_Renuncia.
     * @param fec_Renuncia New value of property fec_Renuncia.
     */
    public void setFec_Renuncia(java.util.Date fec_Renuncia) {
        if (fec_Renuncia==null || fec_Renuncia instanceof LocalDate) 
            this.fec_Renuncia = fec_Renuncia;
        else this.fec_Renuncia = new LocalDate(fec_Renuncia);
    }
    /**
     * Holds value of property contratado.
     */
    private boolean contratado;

    /**
     * Getter for property contratado.
     * @return Value of property contratado.
     */
    public boolean getContratado() {
        return this.contratado;
    }

    /**
     * Setter for property contratado.
     * @param contratado New value of property contratado.
     */
    public void setContratado(boolean contratado) {
        this.contratado = contratado;
    }


    public String getEdad() {
        //set up date of birth
        Calendar calDOB = Calendar.getInstance();
        calDOB.setTime(fec_Nac);
        //setup calNow as today.
        Calendar calNow = Calendar.getInstance();
        calNow.setTime(new java.util.Date());
        //calculate age in years.
        int ageYr = (calNow.get(Calendar.YEAR) - calDOB.get(Calendar.YEAR));
        // calculate additional age in months, possibly adjust years.
        int ageMo = (calNow.get(Calendar.MONTH) - calDOB.get(Calendar.MONTH));
        if (ageMo < 0) {
        //adjust years by subtracting one
            ageYr--;
        }
        return Integer.toString(ageYr);
    }


    public String toString() {
        return "<Profesor id='C" + this.id +
        //idProfesor
        "\" ci =\"" + ci +
        "\" primerNombre =\"" + primerNombre +
        "\" fec_Nac =\"" + fec_Nac +
        "\" fec_Ing_USB =\"" + fec_Ing_USB +
        "\" novel =\"" + novel +
        //set_Pai
        "\" primerApellido =\"" + primerApellido +
        "\" segundoNombre =\"" + segundoNombre +
        "\" segundoApellido =\"" + segundoApellido +
        "\" division =\"" + division +
        "\" departamento =\"" + departamento +
        "\" categoria =\"" + categoria +
        "\" correo =\"" + correo +
        //pas
        //paa
        "\" fec_Renuncia =\"" + fec_Renuncia +
        "\" contratado =\"" + contratado +
        "'/>";
    }

}